/*
 * main.c
 *
 *  Created on: Sep 1, 2012
 *      Author: javier
 */
#include <stdio.h>
#include <stdlib.h>

unsigned char read_buffer[2048];
unsigned char write_buffer[4096];

unsigned long conversor(unsigned long n1,int base1,int base2)
{
unsigned long alg,mult=1,n2=0;
while (n1 > 0)
{
alg = n1 % base1;
n1 /= base1;
n2 += (alg*mult);
mult *= base2;
}
return n2;
}

void ReadFile(char *name)
{
	FILE *file;
	FILE *octal=NULL;
	char *buffer;
	unsigned long fileLen;

	//Abro el archivo binario para lectura
	file = fopen(name, "rb");
	if (!file)
	{
		fprintf(stderr, "Error al abrir el archivo binario %s", name);
		return;
	}
	//Abro el archivo octal(de texto) para escritura
	 octal = fopen("octal.txt","w");
	        if (octal == NULL)
	        {
	            printf("Error al abrir archivo de salida.");
	        	exit(1);
	        }

	//Saco la longitud del archivo
	fseek(file, 0, SEEK_END);
	fileLen=ftell(file);
	fseek(file, 0, SEEK_SET);

	buffer=(char *)malloc(fileLen+1);
	if (!buffer)
	{
		fprintf(stderr, "Error de memoria!");
		fclose(file);
		return;
	}

	//Leo el contenido del archivo en el buffer
	fread(buffer, fileLen, 1, file);
	fclose(file);

	int i;
	unsigned long num_in, num_out;
	for (i=0;i<fileLen;i++)
	{
	     num_in =(int)buffer[i];
	     //convierto a octal
	     num_out = conversor(num_in, 10, 2);
	     //imprimo
	     //TODO acá habría que escribirlo en el de salida.
	     printf("%lo",num_out);

	     // put an extra space between every 4 bytes
	     if (i % 4 == 3)
	     {
	         printf(" ");
	     }

	     // Display 16 bytes per line
	     if (i % 16 == 15)
	     {
	         printf("\n");
	     }
	}

	printf("\n");

	fclose(octal);

	free(buffer);
}

int main(void)
{
	ReadFile("binario");
	printf("ok");
	return 0;
}
